const https = require('https');
const urlQuery = require("querystring");
const redis = require("../../redis/redis-client");
const puppeteer = require("puppeteer");
const axios = require("axios");
const path = require('path');
const fs = require("fs");


//使用 puppeteer.launch 启动 Chrome
(async () => {

  // 连接已打开的浏览器
  let wsKey = await axios.get('http://localhost:21222/json/version');

  const browser = await puppeteer.connect({
    browserWSEndpoint: wsKey.data.webSocketDebuggerUrl,
    defaultViewport: null,
    slowMo: 100,
  })


  // 入库工作台的数据列表
  const inputWorkbenchList = [];

  const sendData = [];
  //当前执行的条数
  let currentItem = 0;

  //每条占滚动条比率
  let ScrollRatio = 0;

  // 当前在第几页
  let currentPage = 1;

  // 获取总页数
  let totalpages = 0;

  // 每次移动条数
  const count = 15;

  // 打开新的浏览器
  // const browser = await puppeteer.launch(
  //   {
  //     headless: false,
  //     defaultViewport: null,
  //     slowMo: 100,
  //     args: [
  //       '--no-sandbox',
  //       '--disable-features=site-per-process',
  //       '--start-maximized'
  //     ],
  //     timeout: 60000
  //   },
  // );

  const page = await browser.newPage();
  await page.goto("http://10.139.3.16/sainty/");

  // const accountInputEle = await page.waitForSelector("input[name='UserName']");
  // await accountInputEle.type("13511677626", { delay: 20 });
  // 输入密码
  // const pwdInputEle = await page.$("input[name='Password']");
  // await pwdInputEle.type("CZ-123456", { delay: 20 });
  // setTimeout(() => {
  //   var twoPI = Math.PI * 2.0;
  //   var screenSize = robot.getScreenSize();
  //   var height = (screenSize.height / 2) - 10;
  //   var width = screenSize.width;
  //   console.log(1);

  //   for (var x = 0; x < width; x++) {
  //     y = height * Math.sin((twoPI * x) / width) + height;
  //     robot.moveMouse(x, y);
  //   }
  //   console.log(2);
  //   robot.typeString("123456");
  //   robot.keyTap("enter")
  // }, 2000);

  const submitBtnEle = await page.$("input[id='LOGINSUBMIT']");
  if (submitBtnEle) {
    await submitBtnEle.click();
  }

  await page.waitForSelector(".menu-warp");
  const lineMenu = await page.$("a[title='仓储物流']");
  await lineMenu.click();

  const inputWorkbench = await page.$("a[title='成品入库工作台']");
  await inputWorkbench.click();

  const iframe = await page.waitForFrame((frame) => (frame.url().includes("InitValue.gtype")));



  if (iframe) {

    // 监听请求的响应的
    page.on("response", (response) => {
      if (response.status() == 200) {
        if (response.url().includes("27.15.50.G0.30.N9STJ.do.ui")) {

          // url query 参数转json
          const queryJson = urlQuery.parse(response.request().postData());

          // 当前组织代码 G118
          if (queryJson && queryJson.storagebatchno && queryJson.storagebatchno == "G118") {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              // 存储的字段数组
              const fields = resData.fields;
              totalpages = resData.rows.length
              resData.rows.map((item) => {

                inputWorkbenchList.push({
                  "contractId": item[1].trim(), //采购合同号
                  "supplierName": getValueByNameId("ccode", item[5], fields), //供应商名称
                  "goodsName": item[9],//商品名称
                  "goodsCount": item[21],//合同数量
                  "transportId": item[7], //入库运编号
                  "clientItemId": item[8], //客户货号
                  "deliveryDate": item[30], //交货日期
                  "warehousedNumber": item[23],//已入库数量
                  "notWarehousedNumber": item[24],//未入库数量
                  "notWarehousedPackages": item[28],//未入库件数
                  "exportContractId": item[29],//出口合同号
                  "salesman": getValueByNameId("wcode", item[31], fields),//业务员
                  "department": getValueByNameId("bcode", item[37], fields),//部门
                  "operator": getValueByNameId("corpbcode", item[38], fields),//经营者
                  "goods": [],
                })
                // key 合同id+客户货号+合同数量+已入库数量+未入库数量+未入库件数   value 1
                const key = (item[1].trim() + item[8] + item[21] + item[23] + item[24] + item[28])
                redis.setString(key, 1);
              })

              // 循环获取列表
              forList()
            })

          }
        }
      }
    })

    await page.waitForTimeout(1000);

    // 输入入库运编号
    const inputIdEl = await iframe.$("input[name='storagebatchno']");
    await inputIdEl.type("G118", { delay: 20 });

    // // 点击展开
    // const developEl = await iframe.$("#UIA_purworkspaceQ__switchcss_ui-pane-collapsed");
    // await developEl.click();

    // // 取消勾选只查待入库>0
    // const checkboxEl = await iframe.$("input[name='coropt#20']");
    // await checkboxEl.click();

    // // 签约日期取消
    // const dateEl = await iframe.$("input[name='odate.[from]']");
    // await dateEl.click();
    // await page.keyboard.press('Backspace');

    // const dateEl = await iframe.$("#UIA_purworkspaceQ_odateform .ui-input-combobtn");
    // await dateEl.click();

    // const NAVYEARNEXT = await iframe.$("#NAVYEARNEXT");
    // await NAVYEARNEXT.click();

    // const NAVMONPREV = await iframe.$("#NAVMONPREV");

    // for (let i = 0; i < 6; i++) {
    //   await NAVMONPREV.click();
    // }
    // const day = await iframe.$("#DAYSELECT .bodyrow .day");
    // await day.click();


    // 点击查询
    const searchEl = await iframe.$("#UIA_purworkspaceQ_btn_wrefreshtbls");
    await searchEl.click();

    await page.waitForTimeout(3000);


    // 下一页按钮 #nextpage

    // 等待获取请求的结果后循环点击下一步
    // await page.waitForTimeout(5000);
    // const tables = await iframe.$eval("tbody", node => {
    //   console.log(node);
    //   return node
    // });
    // console.log(tables);
    // await inputId.type("input[name='storagebatchno']", "G118")
    // const text1 = await iframe.$eval("text[id='152147_Pt']", node => node.innerHTML);
    // sendDataToServer(text1, text1, text1);
    // console.log(new Date() + " pickup datat: ", text1, text1, text1);
  }

  // 方法区--------------------------------------------------------------

  /**
   * 
   * @param {*} name 字段标识
   * @param {*} Id 字段的id值
   * @param {*} array 所有的字段信息数组
   * @returns 匹配到的值
   */

  function getValueByNameId(name, Id, array) {
    let value = "";
    array.map((item) => {
      if (item.name == name) {
        value = item.valueMap[Id]
      }
    })
    return value
  }
  // 合同列表接口 发送数据
  function sendContractListToServer(data) {
    const postData = JSON.stringify(data);
    // console.log(postData);
    const req = https.request({
      hostname: 'zhuyiyun.com',
      path: '/openapi/webhook/842298925882507267/842378384162422786',
      port: 443,
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'secretKey': '8b95cf4b511b49b2901272c4a1351b57'
      }
    }, (res) => {
      console.log("statusCode:", res.statusCode);
    });

    // 设置要发送的内容
    req.write(postData);
    // 如果出错就在控制台输出错误信息
    req.on('error', err => {
      console.log(err);
    });

    req.end();
  }
  // 新增商品信息接口
  function sendGoodsToServer(data) {
    const postData = JSON.stringify(data);
    // console.log(postData);
    const req = https.request({
      hostname: 'zhuyiyun.com',
      path: '/openapi/webhook/842298925882507267/844579870515920899',
      port: 443,
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'secretKey': '8b95cf4b511b49b2901272c4a1351b57'
      }
    }, (res) => {
      console.log("statusCode:", res.statusCode);
    });

    // 设置要发送的内容
    req.write(postData);
    // 如果出错就在控制台输出错误信息
    req.on('error', err => {
      console.log(err);
    });

    req.end();
  }

  // 初始化数据
  async function forList() {
    await page.waitForTimeout(5000);

    //计算比率
    var scrollHeight = await iframe.$eval(".ui-gridtable .ui-grid-bar", el => el.scrollHeight)
    ScrollRatio = scrollHeight / totalpages;
    console.log(ScrollRatio, "-=-=-=-=-=-=---------------------------------- ");

    // 移除监听采购订单合同列表
    page.removeListener('response');

    // 监听采购合同请求里的商品信息
    onGoods();

    // 点击当前视图可见的采购合同订单id 请求商品信息
    //轮循获取入库工作台列表
    await forClickId();
  }

  // 监听采购合同点击
  function onGoods() {
    page.on("response", (response) => {
      if (response.status() == 200) {
        if (response.url().includes("27.15.20.G0.20.N9STJ.do.ui")) {

          // url query 参数转json
          const queryJson = urlQuery.parse(response.request().postData());

          // 商品信息的接口
          if (queryJson && queryJson.gcodeCuicode) {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              // 存储的字段数组
              const fields = resData.fields;
              let goods = [];

              resData.rows.map((item) => {
                goods.push({
                  "warehousingType": getValueByNameId("gstockmode", item[1], fields),//入库登记方式
                  "transportId": item[2], //入库运编号
                  "clientOrderId": item[3],//客户订单号
                  "clientItemId": item[5], //客户货号
                  "goodsType": getValueByNameId("gtype", item[6], fields),//货物类型
                  "goodsName": item[7],//商品名称
                  "goodsDesc": item[8],//商品描述
                  "brand": item[12],//品牌
                  "customsDeclaration": item[13],//单独报关
                  "goodsCount": item[14],//签约数量
                  "goodsUnits": getValueByNameId("qtcunit", item[15], fields),//签约单位
                  // "purchasePrice": item[16],//采购单价
                  "amount": item[17],//金额
                  "deliveryDate": item[18],//交货日期
                  "deliveryAddress": getValueByNameId("deliveryplace", item[19], fields),//交货地址
                  "totalPackages": item[20], //包装件数 总件数
                  "packagesUnit": getValueByNameId("qtxunit", item[21], fields), //包装单位
                  "builtinNum": item[22], //内装数量
                  "exteriorNum": item[23], //外装数量
                  "roughWeight": item[24], //毛重
                  "roughWeightTotal": item[25], //毛重合计
                  "netWeight": item[26], //净重
                  "netWeightTotal": item[27], //净重合计
                  "packType": getValueByNameId("packtype", item[28], fields), //包装类型
                  "matrixingRatio": item[51], //换算比例
                  "total": item[52], //统计总数 总数量
                  "units": getValueByNameId("qtcunit", item[53], fields), //统计单位
                  "hsCode": item[54], //海关编码
                  "shippingMark": item[55], //分唛头
                  "remarks": item[56], //备注
                  "contractId": item[62].trim()
                })
              })
              //  把goods放入采购合同id的goods里
              if (goods.length) {
                const contractIds = inputWorkbenchList.filter(({ contractId }) => contractId == goods[0].contractId);
                contractIds.map((item) => {
                  item.goods = goods
                  // 调接口发送所有的合同列表数据
                  sendContractListToServer(item);
                });
                // 写入文件
                // writeFile(contractIds, "text.txt");
                // 新增商品信息接口
                sendGoodsToServer({ goods: goods })
              }
            })
          }

          // 商品详情的接口 获取合同id 和修改日期
          if (queryJson && queryJson["__Json_._LoadWFInfo"]) {
            response.text().then(res => {
              // 解析字符串形的对象
              const resData = eval("(" + res + ")");
              // key 合同id  value 修改时间
              console.log(resData.rows[0][0].trim(), "hetong");
              redis.setString(resData.rows[0][0].trim(), new Date(resData.rows[0][12]).getTime());
            })
          }
        }
      }
    })
  }

  // 循环点击采购订单合同
  async function forClickId() {

    // 当前页面的15条合同id
    const div = await iframe.$$eval(".gtable tbody tr:not(.emptyrow) td:nth-child(2)", node => node.map((el) => el.innerText.trim()));
    // console.log("div:", div);

    // 当前页面15条需要点击的元素
    const divId = await iframe.$$(".gtable tbody tr:not(.emptyrow) td:nth-child(2)");
    const list = divId.slice(0, count)

    for (let i = 0; i < list.length; i++) {
      console.log("当前索引：", i, "当前合同id", div[i]);
      let item = inputWorkbenchList.find(({ contractId }) => div[i] == contractId);
      if (item && item.goods.length == 0) {

        const res = await redis.getString(item.contractId)

        console.log(res);
        if (!res) {
          await divId[i].click({ clickCount: 2, delay: 100 });
          // 隐藏弹窗 影响点击事件
          const tiptext = await iframe.$(".x-tiptext.ui-layer-frame");
          if (tiptext) await iframe.$eval(".x-tiptext.ui-layer-frame", node => node.style.display = "none");

          const close = await page.$("#tabChangeUl li:last-child .icol-del3");

          await page.waitForTimeout(2000);

          await close.click()
        }
      }
      // 记录执行过的条数
      currentItem++;
      console.log("--------------", "当前执行的条数", currentItem, "总条数", totalpages);
    }

    if (currentItem == totalpages) {
      console.log("end---------inputWorkbenchList:");
      page.close()
      return
    }

    if (currentItem < totalpages) {
      // 执行完当前count条数 滚动翻页 继续执行
      iframe.$eval(".ui-gridtable .ui-grid-bar", (el, { ScrollRatio, currentPage, count }) =>
        (el.scrollTop = ScrollRatio * currentPage * count),
        { ScrollRatio, currentPage, count }
      )

      currentPage++;
      await forClickId()
    }
  }



  // 写入文件
  function writeFile(data, name) {
    fs.writeFile(path + name, JSON.stringify(data), function (err) {
      if (err) return console.log(err);
      console.log("The file was saved!");
    });
  }

  // await browser.close();
})();